let a = {'name': 'alen'}; //

function b() {
    this.name = "alice"
};
let C = new b();

// proto
function User(name, age) {
    this.name = name;
    this.age = age;
    this.regist = function () {
        console.log(this.name + "在注册")
    }
}

// instance
let u1 = new User("alen", 10)

// proto 原型对象
// 添加属性
User.prototype.address = "ShangHai";
// 添加方法
User.prototype.login = function (username, password) {
    console.log(`${username}在登入`);
}

let u2 = new User("Nexora", 10)
u2.login("jay", 15215)

// 获取原型对象
// User.__proto__;
// u1.__proto__;
console.log(User.prototype === u1.__proto__); //

// 在js中所有的实例对象都可以访问Object这个对象中的成员

// Object常用成员
console.log('数字1', typeof 1)
console.log('字符串1', typeof "1")
console.log('空对象', typeof {})
console.log('布尔true', typeof true)
console.log('空数组[]', typeof [])
console.log('null 空', typeof null)
console.log('undefined', typeof undefined)
console.log('函数function(){}', typeof function () {
})

console.log("=================================")
console.log(Object.prototype.toString.call(1));
console.log(Object.prototype.toString.call("1"));
console.log(Object.prototype.toString.call({}));
console.log(Object.prototype.toString.call(true));
console.log(Object.prototype.toString.call([]));
console.log(Object.prototype.toString.call(null));
console.log(Object.prototype.toString.call(undefined));
console.log(Object.prototype.toString.call(function () {
}));

window = {}
// 创建新对象， 设置其原型对象为window
m = Object.create(window)
console.log(m.__proto__ === window)

//
function func() {
    this.name = "alen";
    this.getAge = function () {
    }
};  // 原型

f = new func();  // 实例对象
// 判断原型中是否存在 某个属性
ret = f.hasOwnProperty('name')
res = f.hasOwnProperty('toString')
console.log("the ret is: ", ret)
console.log("the res is: ", res)
// 属性描述符
console.log(Object.getOwnPropertyDescriptor(f, "name")) // { value: 'alen', writable: true, enumerable: true, configurable: true }
// 获取f对象中的所有属性
console.log(Object.getOwnPropertyDescriptors(f))
/**
 * {
 *   name: {
 *     value: 'alen',
 *     writable: true,
 *     enumerable: true,
 *     configurable: true
 *   },
 *   getAge: {
 *     value: [Function (anonymous)],
 *     writable: true,
 *     enumerable: true,
 *     configurable: true
 *   }
 * }
 */

// 获取原型对象
console.log(Object.getPrototypeOf(f)); // {}
console.log(Object.getPrototypeOf(f) === f.__proto__); // true
// 设置原型对象
// Object.setPrototypeOf(f, Object.__proto__)
Object.setPrototypeOf(f, globalThis)
console.log(Object.getPrototypeOf(f));  //

let Man = {
    "name": "小麦"
} // 创建一个Man对象

// 给对象添加两个成员
// Man.age = 10;
Man["age"] = 20;
console.log(Man); // { name: '小麦', age: 20 }

Object.defineProperty(Man, "height", {
    enumerable: false,     // 是否可遍历
    configurable: true,   // 是否可配置      属性是否可以被删除或者修改其属性描述符
    writable: false,     // 是否可通过 赋值运算符修改
    value: 2000         // 属性的值
})

Man.height = 10000;
console.log(Man);   // { name: '小麦', age: 20, height: 2000 }         writeable = false

for (const userKey in Man) {
    console.log(userKey);
}

// 存取描述符
let Stu = {
    "name": "小红"
} // 创建一个Stu对象
let temp = null; // 临时变量
Object.defineProperty(Stu, "score", {
    enumerable: true,
    configurable: true,
    get: function () {
        //获取属性值是调用
        console.log("正在获取值")
        return temp;
    },
    set: function (value) {
        // 赋值操作
        console.log("正在设置值")
        temp = value;
    }
})
console.log(Stu.score);
Stu.score = 200;
console.log(Stu.score);